const path = require('path');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const webpack = require('webpack');
const myPlugin = require('./src/myplugin');

// thread-loader多进程打包，happypack不维护了
module.exports = {
  mode: 'development',
  entry: './src/index.js',
  output: {
    filename: 'index.[hash:8].js',
    // path必须是绝对目录
    path: path.resolve(__dirname, 'dist')
  },
  devtool: "eval-cheap-module-source-map", 
  devServer: {
    port: 8080,
    open: true,
    hot: true,
    contentBase: './static', // 把这个文件夹当作静态服务
    proxy: {
      '/api': {
        target: 'http://localhost:3000',
        pathRewrite: {
          '^/api': '', // 重写路径 api（就是把它替换掉）
        },
        secure: true, //如果是https请求
        changeOrigin: true, // 改变请求的域名（真实请求后端的域名host，比如localhost:3000，否则后端拿到的是localhost:8080）
      }
    },
    // 请求接口的时候先走这个方法，即mock数据
    before: function(app) {
      app.get('/api/user', function(req, res) {
        res.json({ isMock: true })
      })
    },
  },

  // 加载loader先去 ./ 查找，没有再去node_modules
  // resolveLoader: {
  //   modules: ['node_modules', './']
  // },

  plugins: [
    new CleanWebpackPlugin({
      // cleanOnceBeforeBuildPatterns: ['**/*', '!*.html'] // 指定需要清除的文件类型，默认全部['**/*']
    }),
    new HtmlWebpackPlugin({
      template: './public/index.html',
      title: '我的页面', // <%= htmlWebpackPlugin.options.title %>
      filename: 'index.html',
      minify: true
    }),
    // 提取css，link标签引入
    new MiniCssExtractPlugin({
      filename: '[name].[hash:4].css',
    }),
    // 不用每个文件引入包
    new webpack.ProvidePlugin({
      "$": 'jquery'
    }),
    // new splitChunk({

    // }),
    // new webpack.IgnorePlugin(/\/locale/, /moment/),
    // new webpack.DllPlugin({
    //   name: 'dll_[name]',
    //   path: path.resolve(__dirname, './dist/', 'manifest.json')
    // }),
    // new webpack.DllReferencePlugin({
    //   manifest: path.resolve(__dirname, './dist', 'manifest.json')
    // }),
    // new happypack({
    //   id: 'myjs',
    //   use: [{
    //     loader: 'babel-loader',
    //     options: {
    //       presets: [
    //         '@babel/preset-env'
    //       ]
    //     }
    //   }]
    // }),
    new myPlugin()
  ],

  module: {
    noParse: /jquery|lodash/, // 不用解析包中的依赖，加快编译速度
    rules: [
      {
        test: /\.css$/,
        use: [
          {
            loader: 'style-loader',
            options: {
              insert: 'body' // head
            }
          },
          'css-loader',
        ]
      },
      {
        test: /\.less$/,
        use: [
          {
            loader: MiniCssExtractPlugin.loader,
            options: {
              esModule: true
            }
          },
          'css-loader',
          'less-loader'
        ]
      },
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: [
          // 'thread-loader',
          {
            loader: 'babel-loader',
            // 预设 presets
            // 插件 plugins
            options: {
              presets: [
                '@babel/preset-env', // 转成哪个版本
              ],
              plugins: [
                [
                  "@babel/plugin-proposal-decorators", // 装饰器
                  { legacy: true }
                ],
                [
                  "@babel/plugin-proposal-class-properties", // 类中声明静态属性
                  { loose: true }
                ],
                // 和polyfill的区别 https://blog.csdn.net/zwkkkk1/article/details/89143424
                // 需要先安装@babel/runtime
                [
                  "@babel/plugin-transform-runtime", // 重写原型上的方法，比如includes()
                  // { corejs: 3} // 默认的corejs版本3
                ]
              ]
            }
          }
        ],
      }
      // {
      //   test: /\.js$/,
      //   exclude: /node_modules/,
      //   use: "happypack/loader?id=myjs"
      // },
    ]
  }
}